﻿<?php
/*
 * SongDatabase.
 *
 * Sirve como interfaz para la gestión de canciones con la base de datos.
 */
class SongDatabase {
	
	private $database = null;
	
	/*
	 * Constructora con el conector con la base de datos.
	 * @param Database $db
	 */
	function __construct($db) {
		$this->database = $db;
	}
	
	/*
	 * Añade una nueva canción a la tabla songs y asociada a una playlist.
	 * @param int $playlistId
	 * @param Song $song
	 * @param int $iSong
	 * @return boolean false si se ha producido un error en la inserción, true en caso contrario.
	 */
	public function insertNewSongToPlayList($playlistId, $song, $iSong) {
	
		// Se establece el tipo de player al que pertecene la canción
		if (substr_count($song->link, 'youtube') > 0) {
			$song->player = 1;
		}
		
		// Como por ahora solo hay de youtube, se extrae el id de la url
		$idVideoArray = explode("http://www.youtube.com/watch?v=",$song->link);
		$song->idVideo = $idVideoArray[1];
	
		// Se guardan la canción en la base de datos y su relación con la playlist
		$sql ="INSERT INTO `songs` (`link`, `title`, `player`, `idVideo`, `playlistCount`)
			VALUES (
			'".mysql_real_escape_string($song->link)."',
			'".mysql_real_escape_string($song->title)."',
			'".mysql_real_escape_string($song->player)."',
			'".mysql_real_escape_string($song->idVideo)."',
			'1'
		)";
		$this->database->sql($sql);
		
		$sql = "SELECT songs.id FROM `songs` 
			WHERE songs.link = '".mysql_real_escape_string($song->link)."'
		";

		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			$song->id = $row['id'];
		}
		$song->plsCount = 1;
		
		$sql ="INSERT INTO `pl_rel_song` (`playlistId`, `songId`, `order`)
			VALUES (
			'".mysql_real_escape_string($playlistId)."',
			'".mysql_real_escape_string($song->id)."',
			'".$iSong."'
		)";
		return $this->database->sql($sql);
	}
	
	/*
	 * Añade una relación entre una canción y una playlist.
	 * @param int $playlistId
	 * @param Song $song
	 * @param int $iSong
	 * @return boolean false si se ha producido un error en la inserción, true en caso contrario.
	 */
	public function insertSongToPlayList($playlistId, $song, $iSong) {
		$plsCount = -1;
		
		$sql ="INSERT INTO `pl_rel_song` (`playlistId`, `songId`, `order`)
			VALUES (
			'".mysql_real_escape_string($playlistId)."',
			'".mysql_real_escape_string($song->id)."',
			'".$iSong."'
		)";
		$this->database->sql($sql);
		
		$sql = "SELECT songs.playlistCount FROM `songs` 
			WHERE songs.id = '".mysql_real_escape_string($song->id)."'
		";

		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			$plsCount = $row['playlistCount'];
			$plsCount++;
		}
		
		$sql ="UPDATE `songs` SET `playlistCount`=".mysql_real_escape_string($plsCount)."
			WHERE `id` = '".mysql_real_escape_string($song->id)."' ";
		$this->database->sql($sql);
	}
	
	/*
	 * Quita una relación entre una canción y una playlist. Si la canción no está incluida
	 * en ninguna playlist, se elimina.
	 * @param int $playlistId
	 * @param int $songId
	 * @return boolean false si se ha producido un error en la inserción, true en caso contrario.
	 */
	public function removeSong($playlistId, $songId) {
		$plsCount = -1;
		
		$sql ="DELETE FROM `pl_rel_song`
		WHERE `playlistId` = '".mysql_real_escape_string($playlistId)."' and `songId` = '".mysql_real_escape_string($songId)."' ";
		$this->database->sql($sql);
		
		$sql = "SELECT songs.playlistCount FROM `songs` 
			WHERE songs.id = '".mysql_real_escape_string($songId)."'
		";

		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			$plsCount = $row['playlistCount'];
		}
		$plsCount--;
		
		if ($plsCount == 0) {
			$sql ="DELETE FROM `songs`
			WHERE `id` = '".mysql_real_escape_string($songId)."'";
			$this->database->sql($sql);
		}
		else {
			$sql ="UPDATE `songs` SET `playlistCount`=".mysql_real_escape_string($plsCount)."
			WHERE `id` = '".mysql_real_escape_string($songId)."'";
			$this->database->sql($sql);
		}
	}
	
	/*
	 * Obtiene una song de la tabla songs mediante su identificador.
	 * @param integer $song
	 * @return boolean false si se ha producido un error en la obtención, true en caso contrario.
	 */
	public function getSongById($songId) {
	
		$song = null;
	
		$sql = "SELECT songs.id, songs.title, songs.link, songs.player, songs.idVideo, songs.playlistCount  FROM `songs` 
			WHERE songs.id = '".mysql_real_escape_string($songId)."'
		";
	
		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			$song = new Song();
			$song->id = $songId;
			$song->title = $row['title'];
			$song->link = $row['link'];
			$song->player = $row['player'];
			$song->idVideo = $row['idVideo'];
			$song->playlistCount = $row['playlistCount'];
		}
		
		return $song;
	}
	
	/*
	 * Obtiene una song de la tabla songs mediante su link.
	 * @param string $link
	 * @return Song null si no se ha podido obtener.
	 */
	public function getSongByLink($link) {
	
		$song = null;
	
		$sql = "SELECT songs.id, songs.title, songs.link, songs.player, songs.idVideo, songs.playlistCount  FROM `songs` 
			WHERE songs.link = '".mysql_real_escape_string($link)."'
		";
	
		if ($row = mysql_fetch_array($this->database->sql($sql))) {
			$song = new Song();
			$song->id = $row['id'];
			$song->title = $row['title'];
			$song->link = $link;
			$song->player = $row['player'];
			$song->idVideo = $row['idVideo'];
			$song->playlistCount = $row['playlistCount'];
		}
		
		return $song;
	}
	
	/*
	 * Obtiene todas las canciones asociadas a una playlist.
	 * @param int $playlistId
	 * @return Song[] null si no se ha podido obtener.
	 */
	public function getAllSongsFromPlaylist($playlistId) {
	
		$i = 0;
		$retVal = null;
		
		$sql = "SELECT pl_rel_song.songId FROM `pl_rel_song` 
			WHERE pl_rel_song.playlistId = '".mysql_real_escape_string($playlistId)."'
		";
		
		$result = $this->database->sql($sql);
		while($row = mysql_fetch_array($result)) {
		
			$sql = "SELECT songs.id, songs.title, songs.link, songs.player, songs.idVideo, songs.playlistCount FROM `songs` 
				WHERE songs.id = '".mysql_real_escape_string($row['songId'])."'
			";
			if ($rowInner = mysql_fetch_array($this->database->sql($sql))) {
				
				$retVal[$i] = new Song();
				$retVal[$i]->id = $rowInner['id'];
				$retVal[$i]->title = $rowInner['title'];
				$retVal[$i]->link = $rowInner['link'];
				$retVal[$i]->player = $rowInner['player'];
				$retVal[$i]->idVideo = $rowInner['idVideo'];
				$retVal[$i]->playlistCount = $rowInner['playlistCount'];
				$i++;
			}
			
		}
		
		return $retVal;
	}
	
	/*
	 * Actualiza el campo link de una canción en la tabla songs a partir de su id.
	 * @param integer $songId
	 * @param string $link 
	 * @return boolean Devuelve falso si se ha producido un error en la actualización.
	 */
	public function updateLink($songId,$link) {
		$sql ="UPDATE `songs` SET `link`='".mysql_real_escape_string($link)."'
				WHERE `id` = '".mysql_real_escape_string($songId)."'";
		return $this->database->sql($sql);
	}
	
	/*
	 * Actualiza el campo title de una canción en la tabla songs a partir de su id.
	 * @param integer $songId 
	 * @param string $title 
	 * @return boolean Devuelve falso si se ha producido un error en la actualización.
	 */
	public function updateTitle($songId,$title) {
		$sql ="UPDATE `songs` SET `title`='".mysql_real_escape_string($title)."'
				WHERE `id` = '".mysql_real_escape_string($songId)."'";
		return $this->database->sql($sql);
	}
	
}
?>